home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _editors / editors / _stronged / !EXTHELP / EXTHELP / HELPDATA next >
Text File  |  1994-04-09  |  69KB  |  1,905 lines

  1. Wimp Extension
  2.  <Info>
  3.  ------------------
  4.  <Heap=>WimpExt_Heap>
  5.  <Help>
  6.  <Windows>
  7.  <Icons>
  8.  <Menus>
  9.  <Pointer>
  10.  <Borders>
  11.  <Requester boxes>
  12.  <Draw / Sprites=>SprDrw>
  13.  <Saving / Loading=>SveLoad>
  14.  <Misc Vital>
  15.  <Misc Other>
  16.  ------------------
  17.  <Star commands=>Star_Comms>WimpExt_Initialise       &45780
  18.  => R0 = 14
  19.     R1 = <Task handle=>SWI.Wimp_Initialise>
  20.     R2 = <Features flags=>WimpExt_Initialisea> (try 1875)
  21.  
  22.  \<= R0 = WimpExt version number * 100
  23.     R2 = pointer to WimpExt's sprite pool
  24.  
  25. Must be called prior to using any other WimpExt calls.
  26. R0 must be 14 on entry. This is so that WimpExtension
  27. can work out what version the program thinks it is calling
  28. (so I can change the functionality of calls later whilst
  29. still retaining backwards-compatibility).
  30.  
  31. (I have also come accross sugested values of 16 & 11 for R0
  32. in the Manual file. 14 works with v2.17.) WimpExt_CloseDown        &45781
  33.  => R0 = task handle
  34.  
  35. MUST be called prior to the task exiting.WimpExt_SlabIcon         &45782
  36. R2 = window handle or 0 for slabbed icon
  37. R3 = icon handle
  38. If semi-automatic slabbing is enabled, then:
  39. R4 = 0 to pop out, any other to pop in
  40.  
  41. To be called to force an icon to be slabbed (for example to slab the default
  42. action icon if RETURN is pressed). If semi-automatic slabbing is enabled then
  43. the icon will be popped in or out depending on R4, otherwise it will be
  44. popped in and then out again. If R2 is zero then the last icon to be slabbed
  45. in (either implicity or explicity) is used. Note that in this case the SWI
  46. might return an error (eg. if the window has been deleted), so use the X form
  47. of the SWI.WimpExt_Action   (&45784)
  48.  => R0 = task handle
  49.     R1 = Wimp_Poll block
  50.     R2 = Wimp_Poll reason code
  51.  
  52.     R0 = Wimp_Poll reason code (possibly altered)
  53.  
  54. To be called immediately after <Wimp_Poll=>SWI.Wimp_Poll>, to perform actions such as slabbing
  55. icons and changing pointers. WimpExtension may alter the code returned - eg.
  56. if the user clicks in a requester window then the code will be translated
  57. before your program gets to see it.
  58.  
  59. See also <WimpExt_PrePoll>.<WimpExt_CurrentTask =>_CurrentTask >     &4578B
  60. R0 = task handle
  61. Exit:
  62. R0 = previous task handle
  63.  
  64. Informs WimpExtension which task is currently active. Not needed if you have
  65. called <WimpExt_Initialise =>_Initialise >or <WimpExt_Action =>_Action >since the last Wimp_Poll. =>_Poll. >The
  66. previous user is returned in R0.WimpExt_AutoRedraw   (&45798)
  67.  => R1 = <Wimp_Poll=>SWI.Wimp_Poll> reason code 1 block
  68.  
  69. This call can be used instead of the normal 
  70. <Wimp_RedrawWindow=>SWI.Wimp_RedrawWindow>/<GetRectangle=>SWI.Wimp_GetRectangle> loop if the
  71. window doesn't contain any graphics drawn by
  72. your program. It does the equivalent of:
  73.  
  74.         SYS "Wimp_RedrawWindow",,q% TO flag%
  75.         WHILE flag%
  76.                 SYS "<WimpExt_Redraw>",,q%
  77.                 SYS "Wimp_GetRectangle",,q% TO flag%
  78.         ENDWHILE
  79. WimpExt_Redraw   (&45783)
  80.  => R1 = Wimp_RedrawWindow block
  81.  
  82. To be called in the window redraw loop,
  83. to draw the 3D borders round icons.
  84.  
  85. See also <WimpExt_AutoRedraw>.WimpExt_OpenWindowTop   (&4578E)
  86.  => R0 = window handle
  87.  
  88. Opens the window whose handle is in R0,
  89. or brings it to the top if it is already
  90. open. If the 'Back' attribute is set then
  91. it opens it at the back instead. Calls
  92. <WimpExt_OpenLinked>, so linked windows are
  93. handled correctly.WimpExt_CentreWindow   (&45799)
  94.  => R1 = pointer to block:
  95.       R1 +  0   visible area minimum x coordinate
  96.       R1 +  4   visible area minimum y coordinate
  97.       R1 +  8   visible area maximum x coordinate
  98.       R1 + 12   visible area maximum y coordinate
  99.       R1 + 28   window flags
  100.  
  101.  \<=  Block contains altered coordinates
  102.  
  103. This call shifts the x coordinates in the supplied
  104. block so that the window described would be centred
  105. horizontally on the screen. You can use this call
  106. before <Wimp_CreateWindow=>SWI.Wimp_CreateWindow> - eg:
  107.  
  108.        SYS "WimpExt_CentreWindow",,q%
  109.        SYS "<Wimp_CreateWindow=>SWI.Wimp_CreateWindow>",,q% TO handle%
  110.  
  111. or you can use it before <Wimp_OpenWindow=>SWI.Wimp_OpenWindow> - eg:
  112.  
  113.        SYS "WimpExt_CentreWindow",,q%+4
  114.        SYS "<Wimp_OpenWindow=>SWI.Wimp_OpenWindow>",,q%
  115.        
  116. If you are using <WimpExt_LoadTemplates> then windows
  117. can be centred automatically for you (see description
  118. above).
  119.  
  120. See also <WimpExt_CentreWindowV>.WimpExt_CentreWindowV   (&457BE)
  121.  => R1 = pointer to block:
  122.       R1 +  0   visible area minimum x coordinate
  123.       R1 +  4   visible area minimum y coordinate
  124.       R1 +  8   visible area maximum x coordinate
  125.       R1 + 12   visible area maximum y coordinate
  126.       R1 + 28   window flags
  127. Exit:
  128.       Block contains altered coordinates
  129.  
  130. This call shifts the y coordinates in the supplied
  131. block so that the window described would be centred
  132. vertically on the screen. You can use this call
  133. before <Wimp_CreateWindow=>SWI.Wimp_CreateWindow> - eg:
  134.  
  135.        SYS "WimpExt_CentreWindowV",,q%
  136.        SYS "<Wimp_CreateWindow=>SWI.Wimp_CreateWindow>",,q% TO handle%
  137.  
  138. or you can use it before <Wimp_OpenWindow=>SWI.Wimp_OpenWindow>
  139.  - eg:
  140.        SYS "WimpExt_CentreWindowV",,q%+4
  141.        SYS "<Wimp_OpenWindow=>SWI.Wimp_OpenWindow>",,q%
  142.        
  143. If you are using <WimpExt_LoadTemplates> then windows
  144. can be centred automatically for you (see description
  145. above).
  146.  
  147. See also SYS <WimpExt_CentreWindow>WimpExt_OpenFullSize   (&457A4)
  148.  => R2 = window handle
  149.     R3 = window to open behind (-1 = top, -2 = bottom)
  150.  
  151. Opens the window to maximum size - ie. the same as
  152. clicking on the toggle icon.WimpExt_LoadTemplates   (&4578C)
  153.  => R0 = pointer to buffer for storing window handles
  154.     R1 = pointer to user buffer for template (big enough for largest template)
  155.     R2 = pointer to workspace for indirected icons
  156.     R3 = pointer to end of workspace for indirected icons
  157.     R4 = 256-byte font reference array (-1 for no fonts)
  158.     R5 = pointer to filename of templates file
  159.     R6 = pointer to sprite area control block (+1 for Wimp sprite pool)
  160.  
  161. Loads in all the templates from the file whose name is pointed to by R5, and
  162. calles <Wimp_CreateWindow=>SWI.Wimp_CreateWindow> for each one. The value in R6 is placed in the
  163. window block at offset +64. Stores the window handles sequentially in the
  164. buffer pointed to by R0, in the order they are found in the templates file.
  165. On exit the buffer pointed to by R1 will contain the template for the last
  166. window in the file. The buffer for window handles should be big enough to
  167. store all the window handles, each of which is a word. For each window, if
  168. the word on entry is zero the window will be created as usual. Bits that are
  169. set have the following meanings:
  170.  
  171.     Bit   Meaning if set
  172.     ----------------------------------------------
  173.     0     centre window horizontally
  174.     1     don't create window
  175.     2     centre window vertically
  176.  
  177. Bit 1 is useful if you have the last window in the file as one that you want
  178. repeatedly, but you don't want it created at once.WimpExt_CheckWindowOpen   (&4579D)
  179.  
  180. R0 = window handle (or -3 for <requester=>WimpExt_OpenRequester> window)
  181. Exit:
  182. R0 = 0 if window closed, 1 if open
  183.  
  184. Checks to see if the specified window is open.WimpExt_SetWindowTitle   (&4579F)
  185.  => R2 = window handle
  186.     R3 = pointer to string
  187.  
  188. Copies the string in R3 into the window
  189. whose handle is in R2. The title must be
  190. indirected. Updates the screen if necessary.WimpExt_OpenRequester   (&457A6)
  191.  => R2 = title (eg. 'Message from MyTask')
  192.     R3 = text (eg. 'Document not saved. Save?')
  193.     R4 = pointer to <block=>WimpExt_OpenRequestera> containing button definitons
  194.     R5 = button to be used if 'Escape' is pressed (0-3)
  195.  
  196. Opens a requester box with a title, a message and some buttons
  197. along the right-hand edge.
  198.  
  199. The pointer is constrained to the requester window. The buttons
  200. may contain any text up to 8 characters. You can have up to 4
  201. buttons. They are filled with the text specified from the
  202. bottom one (the default) upwards.
  203.  
  204. If the text for a button is a null string then that button will
  205. not be created.
  206.  
  207. Mouse_Click events to the requester
  208. window will be passed from <WimpExt_Action> filtered so that
  209. only Select and Adjust are passed through, the window handle
  210. is -3, and the icon handle will be 0-3. You can check whether
  211. the requester window is open by using <WimpExt_CheckWindowOpen>.WimpExt_CloseRequester   (&457A7)
  212. Closes the requester window and releases
  213. the mouse pointer. This is done automatically
  214. if the user selects a button in the requester
  215. box, or presses Escape or Return. If the
  216. window wasn't open then no error is generated.
  217.  
  218. See also <WimpExt_OpenRequester>WimpExt_LinkWindows   (&45787)
  219.  => R2 = main window handle
  220.     R3 = sub-window handle
  221.     R4 = flags
  222.          bit    meaning
  223.          0      clip linked window to the left
  224.                 of the main window
  225.          1      clip linked window to the right
  226.                 of the main window
  227.          2      clip linked window above the
  228.                 main window
  229.          3      clip linked window below the
  230.                 main window
  231.          4-30   reserved; MUST BE 0
  232.          31     link is hidden
  233.  
  234. Will link two windows so the sub-window moves
  235. with the main window. Currently there is a
  236. limit of 16 linked windows - this may be
  237. removed in a later version.
  238.  
  239. See also <WimpExt_UnLinkWindows>.WimpExt_OpenLinked   (&45788)
  240.  => R1 = Wimp_OpenWindow block
  241.  
  242. To be used instead of <Wimp_OpenWindow=>SWI.Wimp_OpenWindow>.
  243. It does the same thing, but if the
  244. window is linked then it will handle the
  245. link. If the window is not linked, it has
  246. the same effect as Wimp_OpenWindow.
  247.  
  248. See also <WimpExt_CloseLinked>.WimpExt_CloseLinked   (&45789)
  249.  => R1 = Wimp_CloseWindow block
  250.  
  251. To be used instead of <Wimp_CloseWindow=>SWI.Wimp_CloseWindow>.
  252. It does the same thing, but if the
  253. window is linked then it will close the
  254. linked window as well. If the window is
  255. not linked, it has the same effect as
  256. Wimp_CloseWindow.
  257.  
  258. See also <WimpExt_OpenLinked>WimpExt_UnLinkWindows   (&4578A)
  259.  => R2 = main window handle
  260.     R3 = sub-window handle
  261.  
  262. Will remove the link between the specified
  263. window and its subwindow. Note that this
  264. just removes the pointer in WimpExtension
  265. workspace, if the windows are on the screen
  266. they will remain there. You do not have to call
  267. UnLinkWindows before you exit - it is here so
  268. that you can unlink windows while your
  269. application is still running.
  270.  
  271. See also <WimpExt_LinkWindows>.WimpExt_HideLink   (&457A8)
  272.  => R0 = main window handle
  273.     R2 = sub-window handle
  274.  
  275. Temporarily hides the link between the
  276. specified window and its sub-window.
  277. This is useful, for example, for removing
  278. toolboxes in such a way that they can be
  279. replaced later. Note that this call does
  280. no screen update - ie. the sub-window
  281. remains where it is.
  282.  
  283. See also <WimpExt_UnHideLink>.WimpExt_UnHideLink   (&457A9)
  284.  => R0 = main window handle
  285.     R2 = sub-window handle
  286.  
  287. Unhides the previously hidden link.
  288. Note that this call does no screen
  289. update - ie. the sub-window remains
  290. where it is.
  291.  
  292. See also <WimpExt_HideLink>WimpExt_ManualLink   (&46389)
  293.  => R2 = main window handle
  294.     R3 = sub-window handle
  295.     R4 = flags
  296.          bit    meaning
  297.          0      clip linked window to the left of
  298.                 the main window
  299.          1      clip linked window to the right of
  300.                 the main window
  301.          2      clip linked window above the main
  302.                 window
  303.          3      clip linked window below the main
  304.                 
  305.          4-30   reserved; MUST BE 0
  306.          31     link is hidden
  307.     R5 = X offset between main and sub-window
  308.     R6 = Y offset between main and sub-window
  309.  
  310. Will link two windows so the sub-window moves with the
  311. main window. Currently there is a limit of 16 linked
  312. windows - this may be removed in a later version.
  313.  
  314. See also <WimpExt_LinkWindows>.Window-type SWIs
  315. #Prefix WimpExt_
  316. #Table 12 20
  317.  <Redraw>
  318.  <AutoRedraw>
  319.  -------------
  320.  <OpenWindowTop>
  321.  <CentreWindow>
  322.  <CentreWindowV>
  323.  <OpenFullSize>
  324.  <SetExtent>
  325.  <OpenDialogue>
  326.  -------------
  327.  <LoadTemplates>
  328.  <LoadRAMTemplate>
  329.  <CheckWindowOpen>
  330.  <SetWindowTitle>
  331.  <OpenRequester>
  332.  <CloseRequester>
  333.  --------------
  334.  <LinkWindows>
  335.  <UnLinkWindows>
  336.  <OpenLinked>
  337.  <CloseLinked>
  338.  <HideLink>
  339.  <UnHideLink>
  340.  <ManualLink> 
  341. #EndTable Icon-type SWIs
  342. #Prefix WimpExt_
  343. #Table 15 24
  344.  <3D icons=>3D>
  345.  <SlabIcon>
  346.  <PlotBorder>
  347.  <BorderOp>
  348.  -------------
  349.  <IconBarSprite>
  350.  <IconBarText>
  351.  -------------
  352.  <SetIconString>
  353.  <SetIconStringN>
  354.  <SetIcon>
  355.  <GetIcon>
  356.  <SetNumberIcon>
  357.  <GetNumberIcon>
  358.  <Auto inc/dec of icons=>WimpExt_AutoIncDec>
  359.  <IncNumberIcon>
  360.  <DecNumberIcon>
  361.  -------------
  362.  <ViewIcon>
  363.  <SetIconColour>
  364.  <ShadeIcon> 
  365.  ------------
  366.  <MoveCaret>
  367.  <MoveCaretIcon>
  368.  <PutCaretIcon>
  369.  <Key handling=>WimpExt_IconKey>
  370.  ------------
  371.  <DragIcon>
  372.  <Radio icons>
  373. #EndTableWimpExt_IconBarSprite   (&45785)
  374.  => R2 = -2 for left of iconbar, -1 for right
  375.     R3 = pointer to sprite name
  376.     R5 = icon button type (eg. 3)
  377.     
  378.  \<= R0 = icon handle
  379.  
  380. Will place a sprite on the iconbar, returning
  381. the icon handle. Note that the sprite name is
  382. copied out of the memory block, which can be
  383. reused. Also note that the number in R5 is just
  384. the button type, not the flags.
  385.  
  386. See also <WimpExt_IconBarText> and <Wimp_CreateIcon=>SWI.Wimp_CreateIcon>.WimpExt_IconBarText   (&45786)
  387.  => R2 = -2 for left of iconbar, -1 for right
  388.     R3 = pointer to sprite name
  389.     R4 = pointer to text (max. 128 chars inc. terminator)
  390.     R5 = icon button type (eg. 3)
  391.     
  392.  \<= R0 = icon handle
  393.  
  394. Will place a sprite on the iconbar, with a text message
  395. underneath, returning the icon handle. Note that the sprite
  396. name is copied out of the memory block, which can be reused,
  397. but the text remains where it is; this is so you can change
  398. the text after creating the icon. Also note that the number
  399. in R5 is just the button type, not the flags.
  400.  
  401. See also <WimpExt_IconBarSprite> and <Wimp_CreateIcon=>SWI.Wimp_CreateIcon>.WimpExt_SetIconString   (&4578D)
  402.  => R0 = non-zero for ellipsis (only if enabled in
  403.          <WimpExt_Initialise>)
  404.     R2 = window handle
  405.     R3 = icon handle
  406.     R4 = pointer to string
  407.  
  408. Copies the string pointed to by R2 into the specified
  409. indirected text icon, and updates the screen if
  410. necessary. If the caret was in the icon then it is
  411. moved to the end of the new string. Only updates the
  412. screen if anything was changed - ie. if the new string
  413. is the same as the old string then nothing will happen.
  414. If R0 is non-zero and bit 7 was set in R2 in <WimpExt_Initialise>
  415. and the string is longer than the icon can hold then the string will be
  416. post-fixed with '...'.WimpExt_SetIcon   (&4578F)
  417.  => R2 = window handle
  418.     R3 = icon handle
  419.     R4 = 0 to deselect icon, non-zero to select icon
  420.     If bit 6 of R2 was set in <WimpExt_Initialise>:
  421.     R4 = 0 to deselect icon, 1 to select icon, 2 to toggle icon
  422.  
  423.  \<= R0 = old state of icon (0 for unset, 1 for set)
  424.  
  425. Selects the icon if R4 is non-zero, deselects it otherwise.
  426. Updates the screen if necessary. If bit 6 of R2 was set in
  427. WimpExt_Initialise then the alternative parameters are used
  428. as shown. If bit 9 of R2 was set in WimpExt_Initialise and
  429. you are setting the icon, then other icons in the same ESG
  430. will be unset.
  431.  
  432. See also <WimpExt_GetIcon>.WimpExt_GetIcon   (&45790)
  433.  => R2 = window handle
  434.     R3 = icon handle
  435.  
  436.  \<= R0 = 0 if icon is not selected, 1 if it is selected
  437.     R3 = Word at <iconblock=>SWI.Wimp_IconBlock>+20 (ie. pointer to indirected
  438.          text for indirected text icon)
  439.  
  440. Detects whether the icon is selected, and returns 1 in R0
  441. if it is, 0 otherwise. Also returns in R3 the value in the
  442. iconblock at offset 20. For an indirected text icon this
  443. will be a pointer to the text.
  444.  
  445. See also <WimpExt_SetIcon>.WimpExt_SetNumberIcon   (&45791)
  446.  => R0 = base
  447.     R2 = window handle
  448.     R3 = icon handle
  449.     R4 = value
  450.  
  451. Converts the signed integer in R4 into a string
  452. and places it in the icon. Updates the screen as
  453. necessary. The base to be used is specified in
  454. R0 - it must be in the range 2-36.
  455.  
  456. See also <WimpExt_GetNumberIcon>.WimpExt_GetNumberIcon   (&45792)
  457.  => R0 = default base
  458.     R2 = window handle
  459.     R3 = icon handle
  460.  
  461.  \<= R0 = value
  462.  
  463. Converts the string in the icon to a signed
  464. integer and places it in R0. The base to be
  465. used by default is specified in R0 - it must
  466. be in the range 2-36.
  467.  
  468. See also <WimpExt_SetNumberIcon>.WimpExt_IncNumberIcon   (&45793)
  469.  => R0 = base
  470.     R2 = window handle
  471.     R3 = icon handle
  472.     R4 = maximum value
  473.     R5 = step
  474.  
  475.  \<= R0 = new value
  476.  
  477. Converts the string in the icon to an
  478. signed integer, adds the step, and puts
  479. it back. Updates the screen as necessary.
  480. The value will not go beyond the value
  481. passed in R4, and the new value is returned
  482. in R0.
  483.  
  484. See also <WimpExt_DecNumberIcon>WimpExt_DecNumberIcon   (&45794)
  485.  => R0 = base
  486.     R2 = window handle
  487.     R3 = icon handle
  488.     R4 = minimum value
  489.     R5 = step
  490.  
  491.  \<= R0 = new value
  492.  
  493. Converts the string in the icon to an
  494. signed integer, subtracts the step, and
  495. puts it back. Updates the screen as
  496. necessary. The value will not go beyond
  497. the value passed in R4, and the new value
  498. is returned in R0.
  499.  
  500. See also <WimpExt_IncNumberIcon>Drag flags in R0
  501.  => R0 = bits   meaning
  502.          0-1  Horizontal position:
  503.                 00 = left
  504.                 01 = middle
  505.                 10 = right
  506.                 11 = undefined
  507.          2-3  Vertical position:
  508.                 00 = bottom
  509.                 01 = middle
  510.                 10 = top
  511.                 11 = undefined
  512.          4-5  Mouse bounding box:
  513.                 00 = whole screen
  514.                 01 = constrain to parent window
  515.                 10 = constrain to box pointed to by R5
  516.                 11 = undefined
  517.          6    constrain sprite if set, otherwise constrain pointer
  518.          7    shadow if set
  519.          8    use DragASprite even if CMOS flag isn't set
  520.          9-31 reserved; MUST BE 0WimpExt_DragIcon   (&4579A)
  521.  => R0 = <flags=>WimpExt_DragFlags>
  522.     R1 = pointer to sprite block, +1 for Wimp sprite area,
  523.          0 to use dash box
  524.     R2 = window handle
  525.     R3 = icon handle
  526.     R4 = pointer to sprite name (if R1<>0)
  527.     R5 = pointer to mouse bounding box (only if
  528.          necessary - see flags)
  529.          +00 xmin
  530.          +04 ymin
  531.          +08 xmax
  532.          +12 ymax
  533.  
  534. This SWI does one of two things. If the DragASprite module is loaded, and
  535. bit 1 of byte 28 of the CMOS RAM is set, and R1<>0 then it will use the
  536. DragASprite module as follows:
  537.   Work out the parameters to 'DragASprite_Start' and call it. If this
  538.   produces an error then try again with dash box as described below.
  539. Otherwise it makes an ordinary rotating dash box as follows:
  540.   Work out the parameters to 'Wimp_DragBox' and call it. Bits 0-3 and 7 of
  541.   the flags are ignored.
  542. If you are using this SWI at any time with R1<>0 then remember to call
  543. XDragASprite_Stop at appropriate points. You MUST use the X form of the SWI,
  544. and you must ignore errors.WimpExt_PutCaretIcon   (&4579B)
  545. R2 = window handle
  546. R3 = icon handle
  547.  
  548. Works out the length of the text icon
  549. specified and calls <Wimp_SetCaretPosition=>SWI.Wimp_SetCaretPosition>
  550. to position the caret at the end of the string.WimpExt_SetIconStringN   (&457A0)
  551.  => R0 = non-zero for ellipsis (only if enabled in
  552.      <WimpExt_Initialise>)
  553.     R2 = window handle
  554.     R3 = icon handle
  555.     R4 = pointer to string
  556.  
  557. Copies the string pointed to by R2 into the specified
  558. indirected text icon, and updates the screen if necessary.
  559. If the string is longer than the size of the buffer then
  560. the right-hand end of the string is copied (as opposed to
  561. the left-hand end, which is the case if you use
  562. <WimpExt_SetIconString>). If the caret was in the icon then
  563. it is moved to the end of the new string. If R0 is
  564. non-zero and bit 7 was set in R2 in WimpExt_Initialise and
  565. the string is longer than the icon can hold then the
  566. string will be pre-fixed with '...'.WimpExt_SetIconColour   (&457B0)
  567.  => R2 = window handle
  568.     R3 = icon handle
  569.     R4 = foreground colour (0-15 or -1 to keep the same)
  570.     R5 = background colour (0-15 or -1 to keep the same)
  571.  
  572.  \<= R0 = old foreground colour + old background colour * 16
  573.  
  574. Changes the specified icon's colour(s). If there is no
  575. change then the icon is not updated (ie. it doesn't
  576. flicker). This call will now work for anti-aliased fonts,
  577. but the icon MUST have an 'F' validation command, as the
  578. Wimp needs this to specify the icon's colour.WimpExt_ShadeIcon   (&457B1)
  579.  => R2 = window handle
  580.     R3 = icon handle
  581.     R4 = 0 to unshade icon, non-zero to shade icon
  582.     If bit 6 of R2 was set in <WimpExt_Initialise>:
  583.     R4 = 0 to unshade icon, 1 to shade icon, 2 to toggle shade flag
  584.  
  585.  \<= R0 = old state of icon (0 for unshaded, 1 for shaded)
  586.  
  587. Shades the icon if R2 is non-zero, unshades it otherwise. Updates the
  588. screen if necessary. If the caret was in the icon and you are telling
  589. WimpExtension to shade it then the caret is removed (disowned). If bit
  590. 6 of R2 was set in WimpExt_Initialise then the alternative parameters
  591. are used as shown.WimpExt_ViewIcon   (&4638B)
  592.  => R0 = movement type:
  593.          0 = scroll window minimum amount necessary
  594.          1 = centre icon in window (only if it's currently
  595.              outside the window)
  596.          2 = choose 0 or 1 depending on how far outside
  597.              the window the icon is
  598.     R2 = window handle (or -1 for caret window and icon)
  599.     R3 = icon handle (if R2<>-1)
  600.  
  601. Checks to see if the specified icon is in the portion of
  602. the window which is visible on the screen, and scrolls the
  603. window to display it if it isn't. If R2=-1 then the icon
  604. containing the caret (if if belongs to your task) is used.
  605. R0=2 is the recommended movement type to use.WimpExt_MoveCaretIcon   (&46384)
  606.  => R2 = window handle
  607.     R3 = icon handle
  608.  
  609. Moves the caret into the specified icon,
  610. keeping its vertical position as nearly
  611. unchanged as possible. If the caret is
  612. currently disowned then it is placed at
  613. the end of the string in the icon.WimpExt_SetExtent   (&457B5)
  614.  => R0 = window handle
  615.     R1 = pointer to block
  616.          +00 = new work area minimum x
  617.          +04 = new work area minimum y
  618.          +08 = new work area maximum x
  619.          +12 = new work area maximum y
  620.  
  621. Sets the work area extent of the specified
  622. window, altering the values to be whole
  623. pixels, and reopening the window (if already
  624. open) so that the change is reflected on the
  625. screen.WimpExt_MoveCaret   (&457B6)
  626.  => R0 = key
  627.     R2 = window handle
  628.     R3 = icon handle
  629.  
  630.  \<= R0 preserved if no action taken, 0 otherwise
  631.  
  632. Moves the caret from its current writeable icon to
  633. the next one above or below (in number) if the key
  634. in R0 is up arrow (or shift-tab) or down arrow (or
  635. tab). If you set bit 8 of R2 on entry to
  636. <WimpExt_Initialise> then this SWI will be called
  637. automatically for you in <WimpExt_Action>, and the
  638. reason code translated to a null event if the key
  639. is processed.WimpExt_BorderOp   (&46388)
  640.  => R0 = <reason code=>WimpExt_BorderOpa>
  641.          other registers as appropriate for reason code
  642.  
  643. Peforms misc. border read operations.Codes for R0:
  644.   0 : <Get border number=>WimpExt_BorderOpb>
  645.   1 : <Get border width=>WimpExt_BorderOpc>
  646.   2 : <Get bounding box in registers=>WimpExt_BorderOpd>
  647.   3 : <Get bounding box in block=>WimpExt_BorderOpe>Get border number
  648.  => R0 = 0
  649.     R1 = pointer to icon block
  650.  
  651.  \<= R0 = border number, or -1 if the icon has no 3D border
  652.  
  653. Returns the number of the 3D border of the specified icon.
  654. -1 is returned if the icon has no 3D border.Get border width
  655.  => R0 = 1
  656.     R2 = border number (0-6)
  657.  
  658.  \<= R0 = width in OS units, or 0 if R2 did not
  659.           contain a valid border number
  660.  
  661. Returns the width of the 3D border outside the
  662. icon's bounding box. 0 is returned if an invalid
  663. border type is specified.Get icon bounding box in registers
  664.  => R0 = 2
  665.     R1 = pointer to <icon block=>SWI.Wimp_iconblock>
  666.     
  667.  \<= R2 = XMin
  668.     R3 = YMin
  669.     R4 = XMax
  670.     R5 = YMax
  671.  
  672. Returns the bounding box of the icon, including the 3D
  673. border if present.
  674.  
  675. Read icon block with <Wimp_GetIconState=>SWI.Wimp_GetIconState>.Get bounding box in block
  676.  => R0 = 3
  677.     R1 = pointer to icon block
  678.     R2 = pointer to 16-byte block to receive bounding box
  679.  
  680.  \<= block +  0 = XMin
  681.     block +  4 = YMin
  682.     block +  8 = XMax
  683.     block + 12 = YMax
  684.  
  685. Returns the bounding box of the icon, including the 3D
  686. border if present.3D border types
  687.      0  : Standard 3D border. Used for headings and buttons.
  688.           Pops in if clicked on.
  689.      1  : Ridged grouping border. Put it around things of a
  690.           similar nature.
  691.      2  : Like 0, with a channel round it. Used for the default
  692.           button (ie. the one that is pressed if you press
  693.           RETURN).
  694.      3  : Wide border for writeable icons - leave the normal
  695.           black border on the icon and make the background
  696.           white.
  697.      4  : Popped in border - for things that are for
  698.           information only.
  699.      5  : Trenched border - the opposite of border 1. Can be
  700.           clicked on. Suggested use is as an alternate border 1.
  701.      6  : Title border - similar to border 0, but with two
  702.           'dents'. This border is designed to be used as the
  703.           title of a group, with a border 1 icon behind it as
  704.           the frame.
  705.  
  706. If you add 8 to the border number, it will become inert - ie. it
  707. will ignore all mouse clicks and not pop in. Bordered icons
  708. should be filled if you want them to change colour when clicked
  709. on.
  710.  
  711. If you want an icon which doesn't change colour when slabbed in
  712. and out unset the 'Filled' flag
  713.  
  714. Click Shift-Adjust on the iconbar to see an example of this.3D icons
  715. 3D borders are controlled by the 'w' validation command:
  716. #Prefix 3D_
  717.       w <border number>,\<slabbing mask>,\<slabbing time>,\<top left colour>,
  718.        \<bottom right colour>,\<popped in colour>,\<popped out colour>,
  719.        \<channel colour>
  720.  
  721. All the numbers apart from the border number are optional. The defaults are:
  722. wxx,4,15,4,0,1,14,12. These defaults can be changed by the user, using the
  723. star command '<WimpExt Defaults=>Star_Defaults>'. You can specify only some, eg:
  724. w2,4,20 or w2,,,,3.Auto incremtening / decrementing of icons
  725. If, as is often the case, you have a number in an indirected
  726. icon on the screen and you want the user to be able to alter
  727. it, it is nice to have bumper icons next to it as well as
  728. making it writeable. For this purpose, you can specify that
  729. an icon should decrement/increment another icon when clicked
  730. on in the validation string. The syntax of the command is:
  731.  
  732. Syntax: wi\<icon>,\<minimum>,\<maximum>,\<step>
  733.  
  734. The default values are: wixx,0,&7FFFFFFF,1. All the values are
  735. optional apart from the icon number. To make it decrement the
  736. icon instead, use a negative step value. If the user clicks
  737. with Adjust instead of Select then the icon will be incremented
  738. instead of decremented, or vice-versa.Menu SWI's
  739.  <CreateMenu=>WimpExt_CreateMenu>
  740.  <ReCreateMenu=>WimpExt_ReCreateMenu>
  741.  <MenuWidth=>WimpExt_MenuWidth>
  742.  ----------
  743.  <ShadeEntry=>WimpExt_ShadeEntry>
  744.  <TickEntry=>WimpExt_TickEntry>
  745.  -----------
  746.  <GetFontMenu=>WimpExt_GetFontMenu>
  747.  <DecodeFontMenu=>WimpExt_DecodeFontMenu>
  748.  --------------
  749.  <ColoursMenu=>WimpExt_ColoursMenu>
  750.  <OpenDialogue=>WimpExt_OpenDialogue>  WimpExt_ColoursMenu   (&45797)
  751.  => R0 = colour to be ticked
  752.     R2 = 0 to have just colours, 1 to have extra option
  753.  
  754.  \<= R0 = pointer to colour menu
  755.  
  756. Creates a colour menu (like Edit's 'Background' and
  757. 'Foreground' ones), making the text of each option black
  758. or white depending on the brightness of that colour in the
  759. current palette. If the value in R0 on entry is in the
  760. range 0-15 then that colour will be ticked in the menu.
  761. The call returns a pointer to the menu block (in RMA
  762. workspace).
  763.  
  764. If the value in R2 on entry is 1 then a 17th
  765. option will be added, 'Transparent'. You can change the
  766. text of this by changing the menu block if you want (it's
  767. in RMA). The 17th option will be ticked if R0 on entry is 16.WimpExt_OpenDialogue   (&4579C)
  768.  => R2 = window handle
  769.     R3 = X Offset
  770.     R4 = Y Offset
  771.  
  772. Opens the specified window using
  773. <Wimp_CreateMenu=>SWI.Wimp_CreateMenu> at the pointer position,
  774. offset by R3 and R4. The coordinates used
  775. are PointerX-R3,PointerY+R4.WimpExt_CreateMenu   (&457AC)
  776.  => R1 = pointer to menu structure, or
  777.          window handle, or -1 to close menus
  778.     R2 = menu X
  779.     R3 = menu Y
  780.  
  781. Exactly the same as <Wimp_CreateMenu=>SWI.Wimp_CreateMenu>, except
  782. that the parameters are stored so that, after
  783. you have processed the selection, if the user
  784. clicked ADJUST you can call <WimpExt_ReCreateMenu>
  785. to reopen the menu, or this can be done for you
  786. (see <WimpExt_Initialise>).WimpExt_ReCreateMenu   (&457AD)
  787. Reopens the last menu opened with <WimpExt_CreateMenu>.
  788. Generates an error if the last operation was to close a
  789. menu, or if you have not called <WimpExt_CreateMenu> yet.WimpExt_ShadeEntry   (&457AE)
  790.  => R1 = pointer to menu structure
  791.     R2 = number of option to shade/unshade (0...nn)
  792.     R3 = 0 to unshade
  793.        = any other to shade
  794.        
  795.     If bit 6 of R2 was set in <WimpExt_Initialise> then
  796.  
  797.     R3   = 0 to unshade entry
  798.          = 1 to shade icon
  799.          = 2 to toggle shaded flag
  800.  
  801.  \<= R0 = old state (0 for unshaded, 1 for shaded)
  802.  
  803. Shades or unshades the specified menu entry. If bit 6 of R2
  804. was set in <WimpExt_Initialise> then the alternative parameters
  805. are used as shown.WimpExt_TickEntry   (&457AF)
  806.  => R1 = pointer to menu structure
  807.     R2 = number of option to tick/untick (0...nn)
  808.     R3 = 0 to untick
  809.        = any other to tick
  810.        
  811.     If bit 6 of R2 was set in <WimpExt_Initialise> then
  812.     
  813.     R3 = 0 to untick entry
  814.        = 1 to tick entry
  815.        = 2 to toggle tick flag
  816.  
  817.  \<= R0 = old state  (0 for unticked, 1 for ticked)
  818.  
  819. Ticks or unticks the specified menu entry. If bit 6 of R2 was
  820. set in <WimpExt_Initialise> then the alternative parameters are
  821. used as shown.WimpExt_MenuWidth   (&46382)
  822.  => R1 = pointer to menu structure
  823.  
  824. This SWI scans through the specified menu,
  825. altering its width and the widths of all its
  826. submenus, so that all the menus are the minimum
  827. width possible while still displaying the text
  828. correctly (and neatly).WimpExt_GetFontMenu   (&457B7)
  829.  => R0 = 0 to unshade 'System font' entry
  830.        = 1 to shade it
  831.     R1 = pointer to menu title (12 chars max),
  832.          or 0 for default title 'Font'
  833.  
  834.  \<= R1 = pointer to menu structure
  835.  
  836. Reads in the list of fonts currently available
  837. and creates a hierarchial menu structure with
  838. all the fonts listed by family. 'System font'
  839. is also on the root menu. This menu structure
  840. is guaranteed to remain in the same place for
  841. as long as your task is active. The font list
  842. MAY be read in the first time you call
  843. WimpExt_GetFontMenu, or it may have been read
  844. in earlier.
  845.  
  846. See also <WimpExt_DecodeFontMenu>.
  847.  
  848. This SWI may only be called if you set bit 2 of
  849. R2 when you called <WimpExt_Initialise>.WimpExt_DecodeFontMenu   (&457B8)
  850.  => R0 = pointer to buffer for font name
  851.     R1 = pointer to <Wimp_Poll=>SWI.Wimp_Poll> block, reason
  852.          code Menu_Selection
  853.  
  854. The font menu is decoded and the correct font name is
  855. placed in the buffer.
  856.  
  857. If the user selects, for example, 'Trinity' of
  858. 'Trinity.xxx','Trinity.yyy' the submenus will be
  859. followed through, and the font name at the top of each
  860. menu used.
  861.  
  862. See also <WimpExt_GetFontMenu>.
  863.  
  864. This SWI may only be called if you set bit 2 of R2 when
  865. you called <WimpExt_Initialise>.WimpExt_LoadRAMTemplate   (&457A5)
  866.  => R1 = pointer to user buffer for window definition
  867.     R2 = pointer to workspace for indirected icons
  868.     R3 = pointer to end of workspace for indirected icons
  869.     R4 = -1 for no fonts - fonts not supported at present
  870.     R5 = pointer to template
  871.  
  872.  \<= R2 = pointer to end of workspace used (ie. first
  873.           free byte)
  874.  
  875. This call is similar to <Wimp_LoadTemplate=>SWI.Wimp_LoadTemplate> except that it
  876. uses templates in RAM. This is designed to be used in
  877. Module tasks, where you cannot have a separate Templates
  878. file. You would use the supplied 'FNtemplate' function to
  879. insert the template in your module, and then call
  880. WimpExt_LoadRAMTemplate to convert this to a window
  881. definition.
  882.  
  883. At present fonts in templates are not supported - this
  884. shouldn't cause too much of a problem as I have never seen
  885. a program which uses this feature anyway.Borders
  886. #Table 8 12
  887. #Prefix WimpExt_
  888.  <3D borders=>3D>
  889.  <SlabIcon>
  890.  <PlotBorder>
  891.  ----------
  892.  <BorderOp>
  893.  --------
  894.  <Redraw>
  895.  <AutoRedraw>
  896. #EndTable WimpExt_PlotBorder   (&457BD)
  897.  => R0 = <reason code=>WimpExt_PlotBordera>
  898.          Other registers as appropriate for R0
  899.           
  900. Like <Wimp_PlotIcon=>SWI.Wimp_PlotIcon>, except it just redraws the 3D
  901. border. R0 specifies how the coordinates and border
  902. type are to be specified. If bit 31 of R0 is set
  903. then the border will be plotted slabbed in.Reason codes for PlotBorder (&457BD)
  904.  => R0 = 0   R1 = pointer to <icon block=>SWI.Wimp_IconBlock>
  905.              R2 = window handle (or -1 for no window)
  906.              
  907.     R0 = 1   R1 = pointer to block:
  908.                   + 0  Minimum work area x coordinate
  909.                   + 4  Minimum work area y coordinate
  910.                   + 8  Maximum work area x coordinate
  911.                   + 12 Maximum work area y coordinate
  912.                   + 16 <Border type=>3D_border number>
  913.              R2 = window handle (or -1 for no window)Requseter boxes
  914. #Prefix WimpExt_
  915. #Table 4 20
  916.  <OpenRequester>
  917.  <CloseRequester>
  918.  --------------
  919.  <ControlImmediate>
  920. #EndTable Block for WimpExt_OpenRequester (&457A6)
  921.  Text for default button    (eg. 'Save')
  922.  Text for button 1          (eg. 'Discard')
  923.  Text for button 2          (eg. 'Cancel')
  924.        ...WimpExt_ControlImmediate   (&457B9)
  925.  => R1 = <Reason code=>WimpExt_ControlImmediatea>
  926.          Other registers as appropriate for R1
  927.  
  928. This SWI is for using windows like the <Wimp_ReportError=>SWI.Wimp_ReportError> window
  929. that are not multi-tasking. You can only have one 'immediate
  930. window' open at a time, it is always on top of the window pile,
  931. and you MUST NOT call '<Wimp_Poll=>SWI.Wimp_Poll>' while the immediate window
  932. is open.
  933.  
  934. If you call WimpExt_PrePoll while an immediate window is open
  935. then it will be closed automatically - the Wimp does not know
  936. about immediate windows and the screen display would become
  937. corrupted if you kept an immediate window open over a call to
  938. <Wimp_Poll=>SWI.Wimp_Poll> or <Wimp_PollIdle=>SWI.Wimp_PollIdle>.
  939.  
  940. Icon types currently supported are:
  941.   sprite-only non-indirected
  942.   text-only, all types
  943. Unknown icon types will be ignored.Reason codes for WimpExt_ControlImmediate (&457B9)
  944.  => R1 =      -1  <Close immediate window=>WimpExt_ControlImmediateb>
  945.                0  <Close immediate window=>WimpExt_ControlImmediateb>
  946.                1  <Check for mouse click=>WimpExt_ControlImmediatec>
  947.                2  <Open immediate requester and wait for mouse click=>WimpExt_ControlImmediated>
  948.                3  <Redraw icon=>WimpExt_ControlImmediatee>
  949.                4  <Slab icon=>WimpExt_ControlImmediatef>
  950.                5  <Limit pointer=>WimpExt_ControlImmediateg>
  951.                6  <Redraw icon's 3D border=>WimpExt_ControlImmediateh>
  952.                7  <Redraw icon=>WimpExt_ControlImmediatei>
  953.         >= &8000  <Open immediate window=>WimpExt_ControlImmediatej>WimpExt_ControlImmediate (reason 1)
  954. WimpExt will check for mouse clicks on icons in
  955. the window. 3D icons will be slabbed automatically.
  956. -1 is returned if no icon was clicked on.WimpExt_ControlImmediate (reason 1)
  957. WimpExt will check for mouse clicks on icons in
  958. the window. 3D icons will be slabbed automatically.
  959. -1 is returned if no icon was clicked on.WimpExt_ControlImmediate (reason 2)
  960. It opens an 'immediate requester' and waits for a
  961. mouse click on one of the action buttons, or ESCAPE
  962. or RETURN. The icon clicked on is returned in R0.
  963.  
  964. The rest of the registers are as for
  965. <WimpExt_OpenRequester>.WimpExt_ControlImmediate (reason 3)
  966. The icon in the immediate window whose handle is in R0
  967. will be redrawn (presumably because you have changed
  968. the indirected data).
  969.  
  970. The 3D border is not redrawn.WimpExt_ControlImmediate (reason 4)
  971. The icon whose handle is in R0 will be slabbed in or out
  972. depending on R2 - similar to <WimpExt_SlabIcon> for normal
  973. icons.
  974.  
  975. If the specified icon handle is -1 and R2 is 0
  976. then the currently slabbed icon (if any) is used.WimpExt_ControlImmediate (reason 5)
  977. The mouse rectangle is redefined to be the size of the
  978. immediate window - similar to <WimpExt_LimitPointer> for
  979. normal windows. Use <WimpExt_ReleasePointer> to release
  980. the pointer again afterwards.WimpExt_ControlImmediate (reason 6)
  981. The specified icon's 3D border is redrawn.
  982. Icon handle is passed in R0 (?)WimpExt_ControlImmediate (reason 7)
  983. The specified icon is drawn. You do not need to have an
  984. immediate window open to use this reason code.
  985. Icon handle is passed in R0 (?)WimpExt_ControlImmediate (reason =>&8000)
  986. An immediate window is created from the
  987. <Wimp_CreateWindow=>SWI.Wimp_CreateWindow> block pointed to by R1.
  988. Draw / Sprite
  989. #Prefix WimpExt_
  990. #Table 7 17
  991.  <RedirectSprites>
  992.  <IconBarSprite>
  993.  <PlotSprite>
  994.  <SpriteOp>
  995.  -------- 
  996.  <DrawOp>
  997.  <RedrawDraw> 
  998. #EndTable WimpExt_RedirectSprites   (&4638D)
  999.  => R0 = pointer to sprite area control block,
  1000.          or +1 for Wimp sprite area
  1001.     R1 = pointer to <Wimp_CreateWindow=>SWI.Wimp_CreateWindow> block
  1002.  
  1003. Sets the sprite area control block pointer of
  1004. all the indirected, sprite-only icons in the
  1005. <CreateWindow=>SWI.Wimp_CreateWindow> block to R0.WimpExt_PlotSprite   (&457B2)
  1006. This SWI has been replaced by SWI
  1007. <WimpExt_SpriteOp> 0. This call will still be
  1008. supported - it just passes the call on to
  1009. <WimpExt_SpriteOp>.WimpExt_RedrawDraw   (&457B3)
  1010. This SWI has been replaced by SWI
  1011. <WimpExt_DrawOp> 0, which is a lot better at
  1012. displaying draw files than this one. This call
  1013. will still be supported, but if you have written
  1014. a program using it you are strongly recommended
  1015. to change to <WimpExt_DrawOp>.WimpExt_SpriteOp   (&46386)
  1016.  => R0 = <reason code=>WimpExt_SpriteOpa>
  1017.     R1 = sprite control block pointer
  1018.     R2 = sprite pointer
  1019.          Other registers as appropriate for reason code
  1020.  
  1021. This SWI performs various operations on sprites, including
  1022. displaying them onto the screen (or printer). Note that these
  1023. calls need <ColourTrans=>SWI.ColourTrans_> if you are using them with 256-colour
  1024. sprites.
  1025.  
  1026. It is similar to <OS_SpriteOp=>SWI.OS_SpriteOp> in that:
  1027.  
  1028.  R0 + 256 for user sprite area, R2 points to sprite name
  1029.     + 512 for user sprite area, R2 points to sprite
  1030.  R1 = 1 for Wimp pool
  1031.  R2 = Pointer to sprite or sprite name as R0
  1032.  
  1033. Note that R1 & R2 are as here unless otherwise specified.   
  1034.  
  1035. Sprites in the system sprite area are not supported.Reason codes for WimpExt_SpriteOp (&46386)
  1036.  => R0 =  0  <Display sprite=>WimpExt_SpriteOp0>
  1037.           1  <Get palette=>WimpExt_SpriteOp1>
  1038.           2  <Make pixel translation table=>WimpExt_SpriteOp2>
  1039.           3  <Make scaling table=>WimpExt_SpriteOp3>
  1040.           4  <Display sprite scaled=>WimpExt_SpriteOp4>
  1041.           5  <Copy sprite=>WimpExt_SpriteOp5>
  1042.           6  <Copy sprite area=>WimpExt_SpriteOp6>
  1043.           7  <Remove duplicate names=>WimpExt_SpriteOp7>
  1044.           8  <Copy sprite area sprite by sprite=>WimpExt_SpriteOp8>
  1045.           9  <Check if sprite needs to be transformed=>WimpExt_SpriteOp9>
  1046.          10  <Global replace=>WimpExt_SpriteOp10>Get palette (reason 1)
  1047.  => R0 = 1
  1048.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1049.     R2 = Pointer to sprite or sprite name
  1050.  
  1051.  \<= R3  = pointer to sprite's palette, or 0 if
  1052.           it doesn't have one
  1053.     R4 = number of entries in palette
  1054.  
  1055. Locates the specified sprite's palette.Display sprite (reason 0)
  1056.  => R0 = 0
  1057.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1058.     R2 = Pointer to sprite or sprite name
  1059.     R3 = x coordinate (OS units)
  1060.     R4 = y coordinate (OS units)
  1061.     R5 = <plot action=>SWI.OS_SpriteOpd>
  1062.  
  1063. Plots the specified sprite on the screen. This call is
  1064. mode-independent, so if necessary the sprite is changed
  1065. size and/or the colours are chosen appropriately.Make pixel translation table (reason 2)
  1066.  => R0 = 2
  1067.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1068.     R2 = Pointer to sprite or sprite name
  1069.     R3 = pointer to block to contain table
  1070.          (1 byte per colour)
  1071.  
  1072.  \<= block contains pixel translation data
  1073.  
  1074. Calculates a pixel translation table for displaying
  1075. the specified sprite in the current mode. If the
  1076. sprite has no palette then the desktop's colours
  1077. are used.Make scaling table (reason 3)
  1078.  => R0 = 3
  1079.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1080.     R2 = Pointer to sprite or sprite name
  1081.     R3 = Pointer to 16-byte block to contain table
  1082.  
  1083.  \<= block contains scaling table
  1084.  
  1085. Calculates a scaling table for displaying the
  1086. specified sprite at normal size in the current mode.Display sprite scaled (reason 4)
  1087.  => R0 = 4
  1088.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1089.     R2 = Pointer to sprite or sprite name
  1090.     R3 = x coordinate (OS units)
  1091.     R4 = y coordinate (OS units)
  1092.     R5 = plot action
  1093.     R6 = pointer to <sprite scaling table=>SWI.OS_SpriteOpe>
  1094.  
  1095. Plots the specified sprite on the screen, scaled according
  1096. to the table. This call is mode-independent, so if necessary
  1097. the sprite is changed size and/or the colours are chosen
  1098. appropriately. The sprite is first scaled to be the correct
  1099. size in the current mode, then the specified scaling table
  1100. is used.Copy sprite (reason 5)
  1101.  => R0 = 5
  1102.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1103.     R2 = Pointer to sprite or sprite name
  1104.     R3 = pointer to destination sprite area
  1105.          or +1 for Wimp sprite pool
  1106.  
  1107. Copies the specified sprite into the destination
  1108. sprite area. Gives an error if there isn't enough
  1109. room.
  1110.  
  1111. Note that sprites with duplicate names will
  1112. NOT be overwritten; you will end up with two sprites
  1113. with the same name. Copy sprite area (reason 6)
  1114.  => R0 = 6
  1115.     R1 = source sprite control block pointer
  1116.          or +1 for Wimp RMA sprite pool,
  1117.          or +2 for Wimp ROM sprite pool
  1118.     R2 = target sprite control block pointer
  1119.          or +1 for Wimp sprite pool
  1120.  
  1121. Copies ALL the sprites from the source sprite area
  1122. to the target sprite area. Gives an error if there
  1123. isn't enough room. Note that sprites with duplicate
  1124. names will NOT be overwritten; you will end up with
  1125. two sprites with the same name. Remove duplicate names (reason 7)
  1126.  => R0 = 7
  1127.     R1 = <Sprite area=>SWI.OS_SpriteOpb>,
  1128.          or +1 for Wimp sprite pool
  1129.  
  1130. Checks for sprites with duplicate names.
  1131. If any exist, all copies except the LAST
  1132. one will be deleted. Copy sprite area sprite by sprite (reason 8)
  1133.  => R0 = 8
  1134.     R1 = Source <Sprite area=>SWI.OS_SpriteOpb>,
  1135.          or +1 for Wimp RMA sprite pool,
  1136.          or +2 for Wimp ROM sprite pool
  1137.     R2 = Target <Sprite area=>SWI.OS_SpriteOpb>,
  1138.          or +1 for Wimp sprite pool
  1139.  
  1140. Copies ALL the sprites from the source sprite area
  1141. to the target sprite area. Gives an error if there
  1142. isn't enough room.
  1143.  
  1144. The sprites will be copied one by
  1145. one, with duplicate sprite names removed before each
  1146. copy. This means that this call, while being slower than
  1147. '<Copy sprite area=>WimpExt_SpriteOp6>' followed by '<Remove duplicate names=>WimpExt_SpriteOp7>',
  1148. often requires less free memory in the target sprite area.Check if sprite needs to be transformed (reason 9)
  1149.  => R0 = 9
  1150.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1151.     R2 = Pointer to sprite or sprite name
  1152.     R3 = mode to check for, or -1 for current mode
  1153.  
  1154.  \<= R0 = bit    meaning if set
  1155.           0     a pixel translation table would
  1156.                 be needed
  1157.           1     a scaling table would be needed
  1158.        2-31     undefined; will be 0 if the sprite
  1159.                 doesn't need transforming
  1160.  
  1161. Checks whether the specified sprite needs to be <scaled=>WimpExt_SpriteOp3>
  1162. or needs a <pixel translation table=>WimpExt_SpriteOp2> to be plotted correctly
  1163. in the specified mode.
  1164. If either of these things are required, other <WimpExt_SpriteOp>
  1165. calls exist to calculate them for you.Global replace (reason 10)
  1166.  => R0 = 10
  1167.     R1 = <Sprite area=>SWI.OS_SpriteOpb>
  1168.     R2 = Pointer to sprite or sprite name
  1169.     R3 = search colour
  1170.     R4 = replace colour
  1171.  
  1172. Replaces all pixels of colour R3 with pixels of colour
  1173. R4. This routine isn't very fast, but it works. Currently
  1174. it won't work with 256-colour sprites.WimpExt_DrawOp   (&46385)
  1175.  => R0 = <reason code=>WimpExt_DrawOpa>
  1176.          Other registers as appropriate for R0
  1177.  
  1178. This SWI performs various operations on Draw files,
  1179. including rendering them onto the screen (or printer).
  1180.  
  1181. This call has replaced <WimpExt_RedrawDraw>Reason codes for WimpExt_DrawOp   (&46385)
  1182.  => R0 =  0  <Render draw file=>WimpExt_DrawOp0>
  1183.           1  <Calculate bounding box=>WimpExt_DrawOp1>
  1184.           2  <Register unknown object handler=>WimpExt_DrawOp2>Render draw file (reason 0)
  1185.  => R0 = 0
  1186.     R1 = Pointer to <scale/pos table=>WimpExt_DrawOpb>
  1187.     R2 = pointer to first object
  1188.          (ie. beginning of Draw file+40)
  1189.     R3 = pointer to end of last object (ie. end of file)
  1190.     R4 = pointer to <graphics clip box=>WimpExt_DrawOpc>, or 0 for no clipping
  1191.  
  1192.  \<= R0 ù R2 corrupted if scaling is not 1:1
  1193.  
  1194. This call displays a draw file. Objects will be
  1195. checked one by one to see if they are in the
  1196. clipping area, and redrawn if they are. Currently
  1197. the following objects are supported:
  1198.  
  1199.       0 - font table
  1200.       1 - text
  1201.       2 - path
  1202.       5 - sprite
  1203.       6 - group
  1204.       7 - tag
  1205.       
  1206. This is all the objects specified in the RISC OS 2 PRMs,
  1207. except for text AREA objects, which are hardly ever used
  1208. and are very very complicated. Magnifying a draw file by
  1209. more than about 8 times is probably not a good idea because
  1210. rounding errors in the Draw module will start to become
  1211. significant.
  1212.  
  1213. Note that this call requires the <ColourTrans=>SWI.ColourTrans_>
  1214. module. It also requires the FPEmulator module, if and only
  1215. if the scaling is not 1:1.
  1216.  
  1217. This call replacesáthe old SWI <WimpExt_RedrawDraw>, which
  1218. should now not be used. (This call is much better anyway.)Scaling / position table:
  1219.  block + 00 = amount to multiply X by * 65536
  1220.  block + 04 = 0
  1221.  block + 08 = 0
  1222.  block + 12 = amount to multiply Y by * 65536
  1223.  block + 16 = X origin (OS units)
  1224.  block + 20 = Y origin (OS units) Graphics clipping box:
  1225.   block + 00 = XMin
  1226.   block + 04 = YMin
  1227.   block + 08 = XMax
  1228.   block + 12 = YMaxCalculate bounding box (Reason 1)
  1229.  => R0 = 1
  1230.     R2 = pointer to first object
  1231.     R3 = pointer to end of last object
  1232.  
  1233.  \<= R4 = XMin (Draw units)
  1234.     R5 = YMin (Draw units)
  1235.     R6 = XMax (Draw units)
  1236.     R7 = YMax (Draw units)
  1237.  
  1238. Calculates the bounding box of the specified objects.
  1239. The coordinates are returned in Draw units (which are
  1240. OS Units * 256). Grouped objects are not checked
  1241. individually - the group's bounding box is used.
  1242.  
  1243. If no objects with bounding boxes are in the set
  1244. specified then R4-R7 on exit are undefined.
  1245.  
  1246. Unknown object types will not be checked. (This call
  1247. 'knows' all the types described in the RISC OS 2 PRMs.)Register unknown object handler (Reason 2)
  1248.  => R0 = 1
  1249.     R2 = pointer to routine (or 0 for no unknown
  1250.          object handler)
  1251.     R3 = pointer to workspace
  1252.  
  1253. This routine will be called if the Render Draw File
  1254. code encounters an unknown object. The routine has
  1255. the following entry and exit conditions:
  1256.  
  1257.  (SVC mode)
  1258.  => R2  = pointer to object
  1259.     R4  = pointer to scaling and position table
  1260.     R6  = clipping rectangle XMin (pretransformed)
  1261.     R7  = clipping rectangle YMin (pretransformed)
  1262.     R8  = clipping rectangle XMax (pretransformed)
  1263.     R9  = clipping rectangle YMax (pretransformed)
  1264.     R12 = your workspace pointer
  1265.     R13 = pointer to supervisor stack (at least 256
  1266.             bytes guaranteed)
  1267.     R14 = return address
  1268.  
  1269.  \<= R1-R11,R13 preserved
  1270.   V flag set on error, with R0 pointing to standard error blockRadio icons
  1271. There are a couple of validation commands for helping
  1272. with radio icons. 'ws' allows icons to select and deselect
  1273. other icons when clicked on, and 'wu' allows icons to shade
  1274. and unshade other icons.
  1275.  
  1276.  Syntax: ws\<action>,\<icon>[,\<icon>][,\<icon>][,\<icon>]...
  1277.  
  1278. The action code is as follows:
  1279.  
  1280.   0   deselect specified icons
  1281.   1   select specified icons
  1282.   2   toggle specified icons
  1283.  
  1284. The syntax is exactly the same for 'wu' except that the
  1285. icons will be shaded instead of selected. You can specify
  1286. several of these commands in one validation string -
  1287. eg. 'ws1,4;ws2,5;ws0,1'.The Heap Manager
  1288. A heap (as provided by WimpExtension) is a section of
  1289. memory, in which there are several blocks of memory
  1290. (how many & how large is up to the task).
  1291.  
  1292. These blocks move about in memory, and so anchors are
  1293. provided to keep track. Each block has an anchor, and
  1294. !anchor%=block%.
  1295.  
  1296. Block may be resized, freed, compacted, fixed etc.
  1297.  
  1298. Please note that the task must provide the heap
  1299. itself - DIM heap% 1000, for instance.
  1300.  
  1301. WimpExt provides one multi-purpose heap managing call,
  1302. which does different things depending on the reason code.
  1303.  
  1304. Read the <Heap text file=>*Filer_Run \<ExtHelp$Dir\>.Heap> for more info.WimpExt_Heap   (&457BA)
  1305.  => R0 = <reason code=>WimpExt_Heapa>
  1306.     Other registers as apropriate for R0
  1307.  
  1308. This call provides all the heap managing
  1309. features, depending on R0.
  1310.  
  1311. <Info on heaps in general=>WimpExt_HeapHelp>Reason codes for WimpExt_Heap (&457BA)
  1312.  => R0 =  0  <Initialise heap=>WimpExt_Heap0>
  1313.           1  <Heap info=>WimpExt_Heap1>
  1314.           2  <New block=>WimpExt_Heap2>
  1315.           3  <Free unused memory=>WimpExt_Heap3>
  1316.           4  <Resize block=>WimpExt_Heap4>
  1317.           5  <Fast heap tidy=>WimpExt_Heap5>
  1318.           6  <Slow optimal heap tidy=>WimpExt_Heap6>
  1319.           7  <Get anchor=>WimpExt_Heap7>
  1320.           8  <Fix heap   (nested)=>WimpExt_Heap8>
  1321.           9  <Unfix heap (ignore nesting)=>WimpExt_Heap9>
  1322.          10  <Unfix heap (nested)=>WimpExt_Heap10>
  1323.          11  <Add anchors=>WimpExt_Heap11>
  1324.          12  <New block=>WimpExt_Heap12>
  1325.          13  <Release memory, kill heap=>WimpExt_Heap13>Initialise heap (Reason 0)
  1326.  => R0 = 0
  1327.     R1 = Base in memory of heap
  1328.     R2 = No. of anchors.
  1329.  
  1330. Initialise a heap with X anchors in R2.
  1331. More anchors may be added later with
  1332. <reason code 11=>WimpExt_Heap11>, but it is much quicker
  1333. to do it at the start.Heap info (Reason 1)
  1334.  => R0 = 1
  1335.  
  1336.  \<= R2 = Size of largest unused area of memory in heap
  1337.      R3 = Total free memory
  1338.      R4 = Total size of heap
  1339.      R5 = No. of anchors created
  1340.      R6 = Current number of blocks
  1341.  
  1342. This call gives misc. info about the heap.New block (Reason 2)
  1343.  => R0 = 2
  1344.     R1 = 0 (unused)
  1345.     R2 = Size of block
  1346.  
  1347.  \<= R1 = anchor (0 if not enough free memory)
  1348.  
  1349. This call create a new block returning 0 if there
  1350. was not enough memory.Free memory used by block (Reason 3)
  1351.  => R0 = 3
  1352.     R1 = anchor for block
  1353.  
  1354. This call kills a block, and frees it's memory.Resize block (Reason 4)
  1355.  => R0 = 4
  1356.     R1 = Anchor
  1357.     R2 = New size
  1358.  
  1359.  \<= R1 = Flag
  1360.  
  1361. This call resizes a block, returning zero if
  1362. there is no room.Features flags
  1363.  => R2 = bit     meaning
  1364.          0       Semi-automatic slabbing if set, automatic otherwise
  1365.          1       Automatically recreate menus if set
  1366.          2       Task wants to use font menus if set
  1367.          3       Automatically compact <heap=>WimpExt_Heap> once a
  1368.                  second if set
  1369.          4       'Correct' radio icons if set
  1370.          5       Semi-automatic help if set, automatic otherwise
  1371.          6       Use alternative parameters for flag-setting SWIs if set
  1372.          7       Use R0 of <WimpExt_SetIconStringN>
  1373.          8       Automatically call <WimpExt_MoveCaret>
  1374.          9       Unset other icons in ESG when setting icons
  1375.          10      Automatically call <WimpExt_ViewIcon> after moving caret
  1376.          11      Don't allow TAB for moving between writeable icons
  1377.          12-31   reserved; MUST BE 0
  1378.  
  1379. If bit 1 of R2 is set then if the user selects a menu option with the
  1380. ADJUST button then the menu will automatically be recreated when you next
  1381. call <WimpExt_PrePoll> (assuming you used '<WimpExt_CreateMenu>' to create
  1382. the menu, that is).
  1383.  
  1384. If bit 2 of R2 is set then you are allowed to call <WimpExt_GetFontMenu>
  1385. and <WimpExt_DecodeFontMenu> - you are NOT allowed to call them if you do
  1386. not set bit 2.
  1387.  
  1388. If bit 4 of R2 is set then the user won't be able to deselect all of a
  1389. group of radio icons by clicking adjust on the selected icon.Fast tidy (Reason 5)
  1390.  => R0 = 5
  1391.  
  1392. This call makes a very fast, but non-optimal,
  1393. compaction of the heap.
  1394.  
  1395. If bit 3 of R2 is set on entry to
  1396. <WimpExt_Initialise>, then this will automatically
  1397. occur every <WimpExt_PrePoll>.Slow, optimal heap tidy (Reason 6)
  1398.  => R0 = 6
  1399.  
  1400. This call compacts the heap to it's minimum
  1401. possible value, but is somewhat slower than
  1402. <reason code 5=>WimpExt_Heap5>.Get anchor (Reason 7)
  1403.  => R0 = 7
  1404.     R1 = block
  1405.  
  1406.  \<= R1 = anchor
  1407.  
  1408. Use this call if your task needs to know
  1409. the anchor of a block, of which it knows
  1410. the position in memory.Fix heap (Reason 8)
  1411.  => R0 = 8
  1412.  
  1413. This call freezes the heap, so it cannot move in memory.
  1414.  
  1415. To unfreeze, call with <reason code 10=>WimpExt_Heap10>, or <code 9=>WimpExt_Heap9>
  1416.  
  1417. The difference is, code 10 should be called the same no.
  1418. of times as code 8, or the heap will remain frozen if it
  1419. is not called enough times.
  1420.  
  1421. Code 9, however, does not care how many times code 8 has
  1422. been called, and unfreezes the heap anyway:
  1423.  
  1424. FOR i%=0 TO 10
  1425.  SYS "WimpExt_Heap",8  :  REM Freeze
  1426.  ...
  1427.  SYS "WimpExt_Heap",9  :  REM Unfreeze
  1428. NEXT
  1429.  
  1430. Whereas code 9 would just be called once, after the loop. Unfix heap (Reason 9)
  1431.  => R0 = 9
  1432.  
  1433. This call simply unfixes the heap, regardless
  1434. of how many times <reason 8=>WimpExt_Heap8> has been called.Unfix heap (Reason 10)
  1435.  
  1436. This call unfixes the heap, but if <code 8=>WimpExt_Heap8>
  1437. has been called more than once, it will not
  1438. unfix it - to do so, it would have to be called
  1439. the same number of times.
  1440.  
  1441. See also <code 9=>WimpExt_Heap9>Add anchors (Reason 11)
  1442.  => R0 = 11
  1443.     R1 = No. to add
  1444.  
  1445. Add R1 extra anchors. This is quite slow,
  1446. relative to doing it at the start with
  1447. <code 0=>WimpExt_Heap0>.New block (Reason 12)
  1448.  => R0 = 12
  1449.  
  1450.  \<= R1 = Anchor
  1451.  
  1452. This call creates a new block, automatically
  1453. creating a new anchor if necessary.Kill heap (Reason 13)
  1454.  => R0 = 13
  1455.  
  1456. This call kills a heap, freeing the memory it
  1457. was using.Misc. vital
  1458. #Table 8 14
  1459. #Prefix WimpExt_
  1460.  <Initialise>
  1461.  <CloseDown>
  1462.  ---------
  1463.  <PrePoll>
  1464.  <Action>
  1465.  ------
  1466.  <Redraw>
  1467.  <AutoRedraw>
  1468. #EndTable WimpExt_PrePoll   (&457B4)
  1469. To be called immediately before <Wimp_Poll=>SWI.Wimp_Poll>
  1470. or <Wimp_PollIdle=>SWI.Wimp_PollIdle>.
  1471.  
  1472. This filters clicks from requester windows
  1473. and the like, so they appear with proper
  1474. values (-3 for requester window) etc.Saving / Loading data
  1475. #Prefix WimpExt_
  1476. #Table 3 10
  1477.    <DragIcon>
  1478.    <DataSave>
  1479.    <DataLoad>
  1480. #EndTable WimpExt_DataSave   (&457BC)
  1481.  => R0 = file length
  1482.     R1 = pointer to filename (pathname or leafname)
  1483.     R2 = file type
  1484.     R3 = pointer to data
  1485.     R4 = zero to allow files to be saved to your own task,
  1486.          non-zero otherwise
  1487.     R5 = pointer to Wimp_GetPointerInfo block if >=&8000,
  1488.          otherwise file will be saved to current mouse position
  1489.  
  1490.  \<= R0 = 0 if failed due to attempt to save to own task, non-
  1491.     zero otherwise
  1492.  
  1493. Used to save a file from your program to a filer or to another
  1494. task. When you receive the User_Drag_Box event after the user
  1495. has dragged the icon to where they want it put, call
  1496. WimpExt_DataSave to handle the data transfer.
  1497.  
  1498. R5 allows you to use this call to save to a specified place -
  1499. just use R5=0 if you want to save to the pointer position. If
  1500. R4 is non-zero on entry, then if the user has dragged the file
  1501. to a window or icon belonging to your task then no action will
  1502. be taken, and R0 will be zero on exit. Otherwise, when the
  1503. transfer has finished, WimpExtension will send you a message,
  1504. number &45782, with the word at R1+20 having the following
  1505. meaning:
  1506.         0 = file not saved. Error block at R1+24
  1507.         1 = file saved but is 'unsafe' (eg. saved to another task)
  1508.         2 = file saved. Filename at R1+24WimpExt_DataLoad   (&46383)
  1509.  => R0 = 0 : Load into heap block
  1510.              R1 = pointer to DataSave or DataLoad
  1511.                   message block
  1512.              R2 = block pointer of block to receive
  1513.                   file, or 0 to create new block
  1514.              R3 = offset in block to place file
  1515.     R0 = 1 : Load into fixed block
  1516.              R1 = pointer to DataSave or DataLoad message
  1517.                   block
  1518.              R2 = pointer to block to receive file
  1519.              R3 = length of block
  1520.  
  1521. Use this SWI to load files from the filer or other
  1522. applications. If R0=0 then the file is loaded into a
  1523. WimpExt_Heap block, and can be any length, memory
  1524. permitting. If R0=1 then the file is loaded into a
  1525. fixed area of memory, and will not be loaded if it
  1526. exceeds the length of the area. When you receive the
  1527. DataSave or DataLoad message, pass the block onto
  1528. WimpExt_DataLoad, and the transfer will be handled
  1529. automatically. As long as this SWI doesn't return an
  1530. error, when the transfer has finished, WimpExtension
  1531. will send you a message, number &45784, with the word
  1532. at R1+20 having the following meaning:
  1533.         0 = file not loaded. Error block at R1+28
  1534.         1 = file transferred successfully from another task
  1535.         2 = file loaded successfully from disc
  1536. A pointer to the block's anchor is at R1+24, if it was
  1537. loaded into a heap block. Otherwise a pointer to the
  1538. area is at R1+24. If R1+20<>0 then the rest of the block
  1539. contains:
  1540.          + 28 = length of file
  1541.          + 32 = load address of file
  1542.          + 36 = exec address of file
  1543.          + 40 = filename (leafname if transferred from task)
  1544. Obviously you need to have initialised a <heap=>WimpExt_Heap> to use this
  1545. SWI. Note that WimpExtension won't free the block if there's
  1546. an error; your error handler must do this if appropriate.
  1547. The load and exec addresses don't indicate the date if the
  1548. file was transferred from another task (the relevant bits
  1549. will all be zero).Pointer SWIs
  1550. #Prefix WimpExt_
  1551. #Table 5 17
  1552.  <LimitPointer>
  1553.  <ReleasePointer>
  1554.  ----------------
  1555.  <SetPointer>
  1556.  <The 'wp' command>
  1557. #EndTable 
  1558.  ----------------
  1559.  Click Adjust on
  1560.  the iconbar for
  1561.  an example of
  1562.  this.WimpExt_SetPointer   (&45795)
  1563.  => R0 = pointer to sprite name in the Wimp sprite pool,
  1564.          or 0 to reset pointer
  1565.          
  1566.     If R0 >= &8000 (to change pointer)
  1567.     
  1568.     R2 = hotspot X
  1569.     R3 = hotspot Y
  1570.  
  1571. Stores the old pointer palette, and changes the pointer
  1572. palette and shape to the sprite specified in R0 (palette
  1573. optional).
  1574.  
  1575. The 'hotspot' is defined by the X and Y coordinates (pixels)
  1576. in R2 and R3.
  1577.  
  1578. If R0 is \< &8000 then it will reset the pointer to its original
  1579. state. You don't need to check if the pointer is already reset
  1580. or changed as WimpExtension will do this for you.
  1581.  
  1582. Note that the pointer will keep changed until you specifically
  1583. ask for it to be reset - ie. pointer changes over icons will
  1584. be suspended, and the pointer will remain changed outside
  1585. your window's workarea.WimpExt_LimitPointer   (&457A2)
  1586.  => R0 = window handle
  1587.  
  1588. Limits the mouse pointer to the visible area
  1589. of the window specified.
  1590.  
  1591. Note that if there are draggable objects within
  1592. this area and these are used then the mouse
  1593. rectangle is reset. It is also reset if there is
  1594. a change of mode, eg. if the user presses F12 and
  1595. then Return.
  1596.  
  1597. See also <WimpExt_ReleasePointer>.WimpExt_ReleasePointer   (&457A3)
  1598. Releases the limits on the mouse pointer - ie.
  1599. sets the mouse rectangle to be the entire screen.
  1600.  
  1601. Note that this call resets the graphics origin and the
  1602. graphics and text windows.
  1603.  
  1604. See also <WimpExt_LimitPointer>.Help
  1605. #Prefix WimpExt_
  1606. #Table 3 20
  1607.  <SendHelp>
  1608.  <SendWimpHelp>
  1609.  <Interactive help=>WimpExt_InterHelp>
  1610. #EndTable Auto-Interactive help
  1611.       Syntax:wh\<message>
  1612.  
  1613. When the pointer is over the icon, Acorn's Help application
  1614. would display the message specified.
  1615.  
  1616. If you set bit 5 of R2 when you called <WimpExt_Initialise>,
  1617. specifying 'semi-automatic' help then instead of sending the
  1618. message to Help for you, WimpExtension will instead give YOU
  1619. a <message=>WimpExt_HelpMessage>, &45783, giving you the suggested help string.Help message format
  1620. The message format is as follows:
  1621.     + 0   40
  1622.     + 16  &45783
  1623.     + 20  mouse X
  1624.     + 24  mouse Y
  1625.     + 28  button state
  1626.     + 32  window handle (-1 for background, -2 for icon bar,
  1627.            -3 for requester window)
  1628.     + 36  icon handle
  1629.     + 40  suggested text
  1630.  
  1631. You may notice that this is the same as message &502, with
  1632. the message number changed and the suggested text tagged on
  1633. the end. To send this on unchanged, you would use:
  1634.  
  1635. SYS "<WimpExt_SendHelp>",q%+40,q%WimpExt_SendHelp   (&457AA)
  1636.  => R0 = message text
  1637.     R1 = pointer to message block containing message
  1638.          of type &502 or &45783
  1639.  
  1640. Sends a reply to message type &502, with the specified
  1641. text. The message will appear in Help's Interactive Help
  1642. Window, or WimpHelp's Standard Help Window.WimpExt_SendWimpHelp   (&457AB)
  1643.  => R2 = keyword
  1644.     R3 = filename
  1645.  
  1646. Sends a message to WimpHelp, telling it to open a
  1647. hypertext help window from a file as specified in
  1648. R3, with the keyword as specified in R2.Misc Other
  1649. #Table 8 14
  1650. #Prefix WimpExt_
  1651.  <CurrentTask>
  1652.  <Divide>
  1653.  <CopyString>
  1654.  <FindLeaf>
  1655.  <MemCopy>
  1656.  <Sort>
  1657.  <MemMove>
  1658.  <Intersect>
  1659. #EndTable WimpExt_CurrentTask   (&4578B)
  1660.  => R0 = task handle
  1661.  
  1662.  \<= R0 = previous task handle
  1663.  
  1664. Informs WimpExtension which task is currently active.
  1665. Not needed if you have called WimpExt_Initialise or
  1666. WimpExt_Action since the last Wimp_Poll. The
  1667. previous user is returned in R0.WimpExt_Divide   (&45796)
  1668.  => R2 = numerator
  1669.     R3 = denominator
  1670.     
  1671.  \<= R0 = result
  1672.     R2 = remainder
  1673.  
  1674. Returns (R2 DIV R3) in R0 and (R2 MOD R3) in R2.
  1675. Useful for calculating which area of window needs
  1676. to be updated. An error is produced if R3 is zero
  1677. on entry.WimpExt_CopyString   (&4579E)
  1678.  => R2 = 'from' pointer
  1679.     R3 = 'to' pointer
  1680.  
  1681. Copies the control-terminated string from R2 to R3.
  1682. The string stored at R3 will be zero-terminated
  1683. whatever the terminator was for the original string.WimpExt_MemCopy   (&457BB)
  1684.  => R0 = 'from' address (word aligned)
  1685.     R1 = 'to' address (word aligned)
  1686.     R2 = length (not necessarily word aligned)
  1687.  
  1688.  \<= R0 preserved
  1689.  
  1690. Copies an area of memory very quickly. Can cope
  1691. with overlap, R0=R1 or R2=0.WimpExt_Sort   (&46380)
  1692.  => R0 = number of objects to sort
  1693.     R1 = pointer to array of objects
  1694.     R2 = pointer to comparison routine
  1695.     R3 = workspace pointer for comparison procedure
  1696.     R4 = size of object
  1697.     R5 = address of temporary workspace of R4
  1698.          bytes (only needed if R4>63)
  1699.  
  1700. This SWI will sort an array of objects. It is very similar
  1701. to the OS_HeapSort SWI, except that you can use it to sort
  1702. an array of ANY object, rather than just arrays of pointers.
  1703. R2 points to a routine which is entered, in SVC mode, as
  1704. follows:
  1705.   R0  = address of object a
  1706.   R1  = address of object b
  1707.   R12 = value supplied to WimpExt_Sort in R3
  1708.   R13 = supervisor stack
  1709.   R14 = return address
  1710.   
  1711. The routine should compare the two objects and return,
  1712. preserving all registers apart from R0,R1,R12 and R14,
  1713. with flags set as follows:
  1714.  
  1715.   a\<b   Z=0, C=0
  1716.   a=b   Z=1, C=1
  1717.   a>b   Z=0, C=1
  1718.   
  1719. The actual method of sorting is unspecified; suffice it
  1720. to say it's fast...
  1721.  
  1722. Although R5 doesn't have to be word-aligned, the sort
  1723. will probably be faster if it is.WimpExt_MemMove   (&46381)
  1724.  => R0 = from
  1725.     R1 = to
  1726.     R2 = size in bytes
  1727.  
  1728. Copies R2 bytes from R0 to R1. R0 and R1 need not be
  1729. word-aligned, and R2 need not be a multiple of 4.
  1730. This SWI uses the optimised memory copying routine
  1731. given in the RISC OS 2 PRMs. It does not cope with
  1732. overlap (which is why it's separate from <WimpExt_MemCopy>).WimpExt_Intersect        &46387
  1733. -------------------------------
  1734.  => R0 = 0 : Boxes in registers:
  1735.              R2 = XMin1
  1736.              R3 = YMin1
  1737.              R4 = XMax1
  1738.              R5 = YMax1
  1739.              R6 = XMin2
  1740.              R7 = YMin2
  1741.              R8 = XMax2
  1742.              R9 = YMax2
  1743.     R0 = 1 : Boxes in blocks:
  1744.              R2 = pointer to XMin1,YMin1,XMax1,YMax1
  1745.              R3 = pointer to XMin2,YMin2,XMax2,YMax2
  1746.  
  1747.  \<= If they intersect:R0 = 1, C flag set
  1748.     If not           :R0 = 0, C flag clear
  1749.  
  1750. Checks whether the specified rectangles intersect.About Ext Help
  1751. Original text (all 71k) by Jon Ribbens,
  1752. of <DoggySoft>.
  1753.  
  1754. Conversion to the StrongHelp format, code
  1755. for Ext Help by David Rodgman.DoggySoft
  1756. #indent 15
  1757. #sprite 0,0 doggy
  1758. To contact DoggySoft please write to:
  1759.  
  1760.   DoggySoft Consumer Department,
  1761.   Furzefield House,
  1762.   Furzefield Road,
  1763.   Beaconsfield,
  1764.   Bucks, HP9 1PQ. 
  1765.  
  1766. Or ring (0494) 673222 The 'wp' command
  1767. Pointer changes over icons are controlled by the 'wp'
  1768. validation command.
  1769.  
  1770. Syntax:wp\<pointer name>,\<x hotspot>,\<y hotspot>
  1771.  
  1772. The x and y hotspots are optional. What happens is that
  1773. when the pointer is over the icon it will changed to the
  1774. named sprite. The 'hotspot' is the area that is the
  1775. actual 'point' of the pointer. Apart from the following
  1776. supplied standard pointers, the sprite must be in the Wimp
  1777. sprite pool.
  1778.  
  1779. Standard supplied pointers are:
  1780.  
  1781.        ptr_write    (4,4)
  1782.         should be used over writeable icons
  1783.        ptr_menu     (6,5)
  1784.         should be used over icons that lead to menus when
  1785.         clicked with SELECT
  1786.        ptr_direct   (12,6)
  1787.         should be used for resizing objects
  1788.        ptr_hand     (10,9)
  1789.         should be used for dragging objects
  1790.        ptr_cross    (8,4)
  1791.         should be used for accurate pointing
  1792.  
  1793. You can have <user pointers=>WimpExt_Pointerwpa> as well.User pointers
  1794. Pointer sprites should be designed in mode 8, maximum size
  1795. 32x32 pixels. You should be wary of using logical colour 2
  1796. in pointer sprites, as it doesn't work in high-res mono
  1797. modes. The pointer can have a palette if you want it to.
  1798.  
  1799. If you are in a hi-res mode then WimpExtension will try to
  1800. use a sprite of name "\<pointer>22", and then try "\<pointer>"
  1801. if that didn't work. Therefore you can supply hi-res pointers
  1802. as well (they should be in mode 19).Key handling
  1803. As it is often needed that RETURN do the same as clicking
  1804. on the default icon (the one with border type 2), and also
  1805. that the up and down arrow keys move to writeable icons
  1806. above and below, WimpExtension will handle these keys for
  1807. you. Simply include the validation code 'wr' in the
  1808. writeable icon's validation string:
  1809.  
  1810. Syntax:wr[RETURN icon number],[up icon number],
  1811.          [down icon number]
  1812.  
  1813. The icons specified will be used when the user presses RETURN,
  1814. up arrow (or shift-tab) and down arrow (or tab) respectively.
  1815. If the icon specified is a writeable icon then the caret will
  1816. be moved to that icon, otherwise WimpExtension will generate
  1817. a fake Mouse_Click event for that icon, which will make it
  1818. appear to your task as if the user clicked with button status
  1819. %100 on the icon (the mouse coordinates given will be those of
  1820. the caret).
  1821.  
  1822. You may leave out any of the numbers in the syntax, if you do
  1823. so then WimpExtension will not affect the handling of that key.Where to send blank cheques...
  1824. David Rodgman
  1825.  Laurel Farm
  1826.   Upper Strode
  1827.    Winford
  1828.     Bristol
  1829.      BS18 8BGStar Commands
  1830.   <Desktop_WimpExtension=>Star_DeskWE>
  1831.   <WimpExt=>Star_WimpExt>
  1832.   <X=>Star_X>Desktop_WimpExtension
  1833. Like many modules, Wimp Extension
  1834. provides this SWI and then says:
  1835. Do not use *Desktop_WimpExtension
  1836.  
  1837. Do not use it...WimpExt_FindLeaf   (&457A1)
  1838.  => R0 = pointer to pathname
  1839.  
  1840.  \<= R0 = pointer to leafname
  1841.  
  1842. Finds the last occurence of '.' in the string pointed to
  1843. by R0, and returns a pointer to the next character. eg.
  1844. given 'scsi::HardDisc.$.first.second.last'
  1845. it will return a pointer to 'last'. This can be useful
  1846. for both extracting the leaf name, and for determining
  1847. what directory the file is in (by poking a zero to (R0-1)
  1848. - eg. MOV R2,#0  STRB R2,[R0,#-1] ).*X
  1849. Syntax: *X \<command>
  1850.  
  1851. The same as typing * \<command> from
  1852. the command line, but all errors are
  1853. ignored.*WimpExt
  1854. Provides access to misc commands concerning
  1855. the Wimp Extension module. Tasks will not
  1856. need to use these, as they are for the user
  1857. of WimpExtension as opposed to the programmer.
  1858.  
  1859. Commands are:
  1860.  
  1861. <WimpExt Defaults=>Star_Defaults>
  1862. <WimpExt LoseTasks=>Star_LoseTasks>
  1863. <WimpExt SpriteColours=>Star_SpriteCols>*WimpExt Defaults
  1864. Sets the default colours, slabbing time,
  1865. and sprite style.
  1866.  
  1867. Syntax: Defaults \<bottom-right> \<top-left>
  1868.                  \<in> \<channel> \<time>
  1869.                  \<style>
  1870.                  
  1871. Sprite style - 0 = 3D, 1 = flat                 
  1872.  
  1873. Some examples are:
  1874. #Table 8 26
  1875.  <Dark slabbing=>*\<ExtHelp$Dir\>.Defaults.DarkSlab>
  1876.  <Default=>*\<ExtHelp$Dir\>.Defaults.Default>
  1877.  <Flat=>*\<ExtHelp$Dir\>.Defaults.Flat>
  1878.  <Interface II style=>*\<ExtHelp$Dir\>.Defaults.I2Style>
  1879.  <Inverse=>*\<ExtHelp$Dir\>.Defaults.Inverse>
  1880.  <No colour change=>*\<ExtHelp$Dir\>.Defaults.NotSlab>
  1881.  <Official Acorn style=>*\<ExtHelp$Dir\>.Defaults.Official>
  1882.  <Risc OS 3.1 normal style=>*\<ExtHelp$Dir\>.Defaults.310>
  1883.  4 0  2 12 15 0
  1884.  4 0 14 12 15 0
  1885.  7 7  7  0 15 0
  1886.  6 0 14 12 15 0
  1887.  0 4 14 12 15 0
  1888.  4 0  1 12 15 0
  1889.  3 0  3 12 15 0
  1890.  3 0 14 12 15 0
  1891. #EndTable *WimpExt LoseTasks
  1892. LoseTasks tells WimpExtension to forget all
  1893. about any Wimp tasks that are currently
  1894. registered with it. This is not usually a
  1895. good idea, but some bugged programs can
  1896. sometimes manage to crash without
  1897. de-registering themselves, so it can be
  1898. useful.*WimpExt SpriteColours
  1899. SpriteColours sets some of the colours of some of
  1900. the sprites in the WimpExtension sprite pool.
  1901. Each parameter specifies the colour of the symbol
  1902. in a different sprite.
  1903.  
  1904. Syntax: *WimpExt SpriteColours \<radioon> \<opton>
  1905.                                \<yes> \<no>